package com.heima.movement.utils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadUtil {

    // 1. 先创建好线程池的实例
    // 参数一：核心线程数
    // CPU * 2
    // 参数二：最大线程数 -> 核心线程满了 -> 对列满了 -> 要临时开多少个线程去处理任务
    // 假设最大值1000个 -> 32核心线程数 -> 1000长度对列
    // 最大线程数 = 核心线程数 + 100
    // 参数三参数四：
    // 根据你执行任务的最大时间去判断的
    // 预估未来上线之后，我们最大并发维持 1100个，得到最大响应时间 4.5s
    // 参数五
    // 参数六：线程工厂 -> 对创建线程的过程进行标准化，统一设置了线程名称，线程优先级
    // 参数七：当核心线程、队列、临时线程都不能满足任务使用，剩余那些任务要怎么处理
    // 1. 抛弃并抛出异常
    // 2. 抛弃当不抛出异常
    // 3. 抛弃最前面那个，但不抛出异常
    // 4. 用主线程去执行
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            32,
            132,
            5000,
            TimeUnit.MICROSECONDS,
            new ArrayBlockingQueue<>(1000),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );

    // 2. 提供一个方法，调用这个方法可以获取我前面创建好的那个线程池实例
    public static ThreadPoolExecutor getInstance() {
        return executor;
    }

}
